home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 2: Applications / Linux Cubed Series 2 - Applications.iso / hamradio / tnos-2.000 / tnos-2 / sam.c < prev    next >
C/C++ Source or Header  |  1996-06-22  |  6KB  |  235 lines

  1. #include "global.h"
  2. #include "commands.h"
  3. #include "mbuf.h"
  4. #include "socket.h"
  5. #include "session.h"
  6. #include "proc.h"
  7. #include "netuser.h"
  8. #include "tty.h"
  9. #include "samapi.h"            /* samapi interface spec */
  10.  
  11. #if !defined(_lint) && !defined(MSDOS)
  12. static char rcsid[] OPTIONAL = "$Id: sam.c,v 1.7 1996/06/22 22:45:24 root Exp root $";
  13. #endif
  14.  
  15. #ifdef SAMCALLB
  16. /*
  17.  * functions in samlib.c
  18.  */
  19.  
  20. int LocateSam(void);
  21. int CallSam(int cmd, void far *cmdbuf, void far *rspbuf);
  22. extern char *Callserver;  /* buckbook.c */
  23. extern int usesplit;
  24. int cb_lookup __ARGS((int s,char *str,FILE *fp));
  25. static char Nofind[] = "*** Call not found in SAM database of %s as of %s\n\n";
  26. static char callhdr[] = "Amateur Radio Callsign: %s  (%s Class)  born in 19%s\n";
  27. int SAMoutbytes = 0;
  28. extern void *malloc __ARGS((unsigned nb));
  29. extern void leadingCaps __ARGS((char *str, int mode));
  30.  
  31.  
  32. int
  33. docallbook(argc,argv,p)
  34. int argc;
  35. char *argv[];
  36. void *p;
  37. {
  38. struct sockaddr_in sock;
  39. const char *cp;
  40. int s,i;
  41. struct mbuf *bp;
  42. struct session *sp;
  43. int thesocket, err;
  44.  
  45.     /*Make sure this comes from console - WG7J*/
  46.     if(Curproc->input != Command->input)
  47.         return 0;
  48.  
  49.     /* Allocate a session descriptor */
  50.     if((sp = newsession(argv[1],TELNET,0)) == NULLSESSION){
  51.         tputs(TooManySessions);
  52.         keywait(NULLCHAR,1);
  53.         return 1;
  54.     }
  55.     sp->ttystate.echo = sp->ttystate.edit = 0;
  56.     sp->flowmode = 1;
  57.     sock.sin_family = AF_INET;
  58.     sock.sin_port = IPPORT_CALLDB;
  59.     thesocket = Curproc->output;
  60.     for(i=1;i<argc;i++){
  61.         if (!Callserver || !*Callserver)    {
  62.             tputc('\n');
  63.             if ((err = cb_lookup (Curproc->output, argv[i], (FILE *) 0)) != 0)
  64.                 tprintf ((err == 1) ? "SAMAPI not loaded!\n" : "Amateur Call '%s' not found or invalid!\n", argv[i]);
  65.             continue;
  66.         }
  67.         tprintf("Resolving %s... ",Callserver);
  68.         if((sock.sin_addr.s_addr = resolve(Callserver)) == 0){
  69.             tprintf("Host %s unknown\n",Callserver);
  70.             continue;
  71.         }
  72.         tprintf("trying %s",psocket((struct sockaddr *)&sock));
  73.         if((sp->s = s = socket(AF_INET,SOCK_STREAM,0)) == -1){
  74.             tputs(Nosock);
  75.         break;
  76.         }
  77.         sockmode(s,SOCK_ASCII);
  78.         if(connect(s,(char *)&sock,sizeof(sock)) == -1){
  79.             cp = sockerr(s);
  80.             tprintf(" -- Connect failed: %s\n",cp != NULLCHAR ? cp : "");
  81.             close_s(s);
  82.             sp->s = -1;
  83.             continue;
  84.         }
  85.         tputc('\n');
  86.         usflush(thesocket);
  87.         usprintf(s,"%s\n",argv[i]);
  88.         while(recv_mbuf(s,&bp,0,NULLCHAR,(int *)0) > 0){
  89.             send_mbuf(thesocket,bp,0,NULLCHAR,0);
  90.         }
  91.         close_s(s);
  92.         sp->s = -1;
  93.     }
  94.     keywait(NULLCHAR,1);
  95.     freesession(sp);
  96.     return 0;
  97. }
  98.  
  99.  
  100. static int
  101. cb_look (str, incall, outcall, err)
  102. char *str;
  103. cmdfindcall_t *incall;
  104. rspdatarec_t *outcall;
  105. int *err;
  106. {
  107.     if (!str || strlen(str) > 6)
  108.         return 2;        /* not an amateur call */
  109.     /* make sure the resident code (SAMAPI.EXE) has been installed */
  110.     if (LocateSam())
  111.         return 1;
  112.  
  113.     /* build command block and call SAMAPI, function SamFindCall */
  114.     incall->packflags = 0;    /* 0 to unpack all data record fields */
  115.     strncpy(incall->call, str, 6);
  116.     incall->call[6] = 0;
  117.     *err = CallSam(SamFindCall, incall, outcall);
  118.     return 0;
  119. }
  120.  
  121.  
  122. char *
  123. cb_lookname (str)
  124. char *str;
  125. {
  126. int err;
  127. cmdfindcall_t sam_in;    /* buffer for samapi find command */
  128. rspdatarec_t sam_out;    /* buffer for result of samapi find command */
  129. char *name, from[8], *cp;
  130.  
  131.     strncpy (from, str, 6);
  132.     from[6] = 0;
  133.     if ((cp = strchr (from, '@')) != 0)
  134.         *cp = 0;
  135.     if ((cp = strchr (from, '%')) != 0)
  136.         *cp = 0;
  137.  
  138.     if (cb_look (from, &sam_in, &sam_out, &err) || err == SerrNotFound)
  139.         return ((char *) 0);
  140.      
  141.     name = malloc(strlen(sam_out.d.FirstName) + strlen(sam_out.d.LastName) + 7);
  142.     if (name)    {
  143.         leadingCaps (&sam_out.d.FirstName[1], 1);
  144.         leadingCaps (&sam_out.d.LastName[1], 0);
  145.         sprintf(name, " (%s ", sam_out.d.FirstName);
  146.         if (sam_out.d.MidInitial[0] != ' ')
  147.             sprintf (&name[strlen(name)], "%s. ", sam_out.d.MidInitial);
  148.         sprintf (&name[strlen(name)], "%s)", sam_out.d.LastName);
  149.     }
  150.     return (name);
  151. }
  152.  
  153.  
  154.  
  155. /* return values - 1=SAMAPI not found, 2=call not found or invalid, 0=okay */
  156. int
  157. cb_lookup (s, str, fp)
  158. int s;
  159. char *str;
  160. FILE *fp;
  161. {
  162. int err, response;
  163. cmdfindcall_t sam_in;    /* buffer for samapi find command */
  164. rspdatarec_t sam_out;    /* buffer for result of samapi find command */
  165. cmdfindcounty_t cty_in;    /* buffer for find county command */
  166. rspfindcounty_t cty_out;    /* buffer for find county response */
  167. rhdr_t date_in;
  168. rspdbdate_t date_out;
  169. char *class;
  170.  
  171.     SAMoutbytes = 0;
  172.     if ((response = cb_look (str, &sam_in, &sam_out, &err)) != 0)
  173.         return response;
  174.  
  175.     /* check for unusual error something other that plain ole not found */
  176.     if (err != 0 && err != SerrNotFound)
  177.         return 2;
  178.  
  179.     /* check for just not found */
  180.  
  181.     if (err == SerrNotFound)    {
  182.         err = CallSam(SamGetDatabaseDate, &date_in, &date_out);
  183.         if (fp)
  184.             SAMoutbytes += fprintf (fp, Nofind, date_out.scope, date_out.date);
  185.         else
  186.             SAMoutbytes += usprintf(s, Nofind, date_out.scope, date_out.date);
  187.         return 2;
  188.     }
  189.  
  190.     switch (sam_out.d.Class[0])    {
  191.         case 'N':    class = "Novice";
  192.                 break;
  193.         case 'T':    class = "Technician";
  194.                 break;
  195.         case 'G':    class = "General";
  196.                 break;
  197.         case 'A':    class = "Advanced";
  198.                 break;
  199.         case 'E':    class = "Extra";
  200.                 break;
  201.     }
  202.  
  203.     if (fp)    {
  204.         /* display call with leading space stripped */
  205.         SAMoutbytes += fprintf(fp, callhdr, sam_out.d.Call + (sam_out.d.Call[0] == ' '), class, sam_out.d.Dob);
  206.  
  207.         /* display first m last, but leave out middle and space if no middle initial */
  208.         SAMoutbytes += fprintf(fp, "%s ", sam_out.d.FirstName);
  209.         if (sam_out.d.MidInitial[0] != ' ')
  210.             SAMoutbytes += fprintf(fp, "%s ", sam_out.d.MidInitial);
  211.         SAMoutbytes += fprintf(fp, "%s\n", sam_out.d.LastName);
  212.  
  213.         /* address line, then city, st zip */
  214.         SAMoutbytes += fprintf(fp, "%s\n", sam_out.d.Address);
  215.         SAMoutbytes += fprintf(fp, "%s, %s %s\n\n", sam_out.d.City, sam_out.d.State, sam_out.d.Zip);
  216.     } else    {
  217.         /* display call with leading space stripped */
  218.         SAMoutbytes += usprintf(s, callhdr, sam_out.d.Call + (sam_out.d.Call[0] == ' '), class, sam_out.d.Dob);
  219.  
  220.         /* display first m last, but leave out middle and space if no middle initial */
  221.         SAMoutbytes += usprintf(s, "%s ", sam_out.d.FirstName);
  222.         if (sam_out.d.MidInitial[0] != ' ')
  223.             SAMoutbytes += usprintf(s, "%s ", sam_out.d.MidInitial);
  224.         SAMoutbytes += usprintf(s, "%s\n", sam_out.d.LastName);
  225.  
  226.         /* address line, then city, st zip */
  227.         SAMoutbytes += usprintf(s, "%s\n", sam_out.d.Address);
  228.         SAMoutbytes += usprintf(s, "%s, %s %s\n\n", sam_out.d.City, sam_out.d.State, sam_out.d.Zip);
  229.     }
  230.     return 0;
  231. }
  232. #endif
  233.  
  234.  
  235.